#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QList>
#include <QTimer>
#include <QStandardItemModel>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

// 定义进程控制块 (PCB) 结构体
struct PCB {
    QString name;        // 进程标识符
    int priority;        // 进程优先数
    int totalTime;       // 进程总共需要的时间
    int cpuTime;         // 进程已占用CPU时间
    int neededTime;      // 进程还需的时间
    QString state;       // 进程状态: "就绪", "运行", "完成"
};

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    // UI 控件对应的槽函数
    void on_addProcessButton_clicked();
    void on_startButton_clicked();
    void on_resetButton_clicked();
    void on_roundRobinRadioButton_toggled(bool checked);

    // 模拟器定时器触发的槽函数
    void updateSimulation();

private:
    Ui::MainWindow *ui;

    // 枚举，用于表示调度算法
    enum Algorithm {
        Priority,
        RoundRobin
    };

    // 核心数据结构
    QList<PCB> initialProcesses; // 存储用户添加的所有进程
    QList<PCB> readyQueue;       // 就绪队列
    QList<PCB> finishedQueue;    // 完成队列
    PCB* runningProcess = nullptr; // 指向当前正在运行的进程

    // Qt 相关
    QTimer *simulationTimer; // 模拟时钟
    int simulationTime = 0; // 当前模拟时间
    int timeSliceCounter = 0; // 用于时间片轮转的计数器
    Algorithm currentAlgorithm; // 当前选择的算法

    // 表格模型
    QStandardItemModel *readyModel;
    QStandardItemModel *runningModel;
    QStandardItemModel *finishedModel;

    // 私有辅助函数
    void setupTableViews();   // 初始化表格视图
    void updateViews();       // 根据当前队列状态刷新所有视图
    void resetSimulation();   // 重置整个模拟器
    void setControlsEnabled(bool enabled); // 统一设置控件的可用状态
    void runSingleStep();     // 新增: 执行一个模拟步骤的核心逻辑
};
#endif // MAINWINDOW_H

